package com.axxc.jpa.aspect;

import java.lang.reflect.Method;
import java.util.Arrays;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.reflect.MethodSignature;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

/**
 * @ClassName: MyLogAspect
 * @Description: 切面,扫描标记注解
 * @author xxc
 * @date 2018年9月17日 下午2:34:42
 * @see {@link https://gitee.com/biuabiu }
 */
@Aspect // 定义为切面
@Component // 纳入容器管理
public class MyLogAspect {

	private Logger logger = LoggerFactory.getLogger(getClass());

	// @Pointcut("@annotation(com.axxc.jpa.annotation.MyLog)") // 切入点为标记该注解的地方
	// @Pointcut("execution(* com.axxc.*.web..*.*(..))") // SPEL表达式.拦截指定方法,可复用

	// 前置通知
	@Before("@annotation(com.axxc.jpa.annotation.MyLog)") // 拦截标记注解的地方
	public void before(JoinPoint jp) {
		String methodName = jp.getSignature().getName();
		logger.info("【前置通知】the method 【" + methodName + "】 begins with " + Arrays.asList(jp.getArgs()));
		MethodSignature signature = (MethodSignature) jp.getSignature();// 因为在方法级别上使用,强转
		Method method = signature.getMethod();
		System.out.println(jp.getArgs());
		System.err.println(method);
	}
}
